home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / lang / ConvertFDPlus.lha / ConvertFDPlus / ConvertFDPlus.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-07  |  25.5 KB  |  861 lines

  1. /*
  2. // ##########################################################################
  3. // ####                                                                  ####
  4. // ####             ConvertFDPlus - An Amiga FD file converter           ####
  5. // ####          ===============================================         ####
  6. // ####                                                                  ####
  7. // #### ConvertFDPlus.c                                                  ####
  8. // ####                                                                  ####
  9. // #### Version 3.00  --  October 06, 2000                               ####
  10. // ####                                                                  ####
  11. // #### Copyright (C) 1992  Thomas Dreibholz                             ####
  12. // ####                     Molbachweg 7                                 ####
  13. // ####                     51674 Wiehl/Germany                          ####
  14. // ####                     EMail: Dreibholz@bigfoot.com                 ####
  15. // ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
  16. // ####                                                                  ####
  17. // ##########################################################################
  18. */
  19.  
  20. #include <exec/devices.h>
  21. #include <exec/io.h>
  22. #include <libraries/dos.h>
  23. #include <intuition/intuition.h>
  24. #include <graphics/rastport.h>
  25.  
  26. UBYTE *KNamen[]={"Close","Exit","Input","Open","Output","Read",
  27.                  "Write","Translate","Wait","-","-"};
  28. #define KNAMEN 9
  29. #define VERSION "3.0"
  30. #define HELP(t) if(GList[10]->Flags & SELECTED) Ausgabe(t);
  31.  
  32. struct IntuitionBase *IntuitionBase=NULL;
  33. struct GfxBase *GfxBase=NULL;
  34. struct Library *DigitalBase=NULL;
  35. struct RastPort *rp=NULL;
  36. struct ViewPort *vp=NULL;
  37. struct Window *con=NULL;
  38. struct Window *win=NULL;
  39. struct Screen *scr=NULL;
  40. struct Gadget *GList[50];
  41. struct MsgPort *Port=NULL;
  42. struct IOStdReq *io=NULL;
  43. struct DateStamp *uhr=NULL;
  44. LONG ConDev=-1L;
  45. UBYTE FileName[200],Undo1[200],NeuerName[200],Undo2[200];
  46. UWORD Array[]={0,0,595,0,595,12,0,12,0,0};
  47. struct Border bor={-2,-2,2,0,JAM1,5,&Array,NULL};
  48. struct StringInfo sp1={&FileName,&Undo1,0,200,0,0,0,0,0,0,0L,0L,0L};
  49. struct StringInfo sp2={&NeuerName,&Undo2,0,200,0,0,0,0,0,0,0L,0L,0L};
  50. struct Gadget str2={NULL,22,76,596,10,0L,RELVERIFY,STRGADGET,&bor,0L,0L,0L,&sp2,21,0L};
  51. struct Gadget str1={&str2,22,46,596,10,0L,RELVERIFY,STRGADGET,&bor,0L,0L,0L,&sp1,20,0L};
  52. struct TextAttr tx={"topaz.font",8,FS_NORMAL,FPF_ROMFONT};
  53. struct NewScreen ns={0,0,640,256,4,0,1,HIRES,CUSTOMSCREEN,&tx,0L,0L,0L};
  54. struct NewWindow nw={0,0,640,256,0,1,VANILLAKEY|GADGETDOWN|GADGETUP,RMBTRAP|ACTIVATE|BORDERLESS,
  55.                      &str1,0L,0L,0L,0L,640,256,640,256,CUSTOMSCREEN};
  56. struct NewWindow rd={95,75,450,75,0,1,GADGETUP,RMBTRAP|ACTIVATE,
  57.                      0L,0L,0L,0L,0L,640,256,640,256,CUSTOMSCREEN};
  58. struct NewWindow cw={320,180,296,57,0,2,0L,RMBTRAP|BORDERLESS,0L,0L,0L,0L,0L,640,256,640,256,CUSTOMSCREEN};
  59. BOOL Arg1=FALSE,Arg2=FALSE,Auto=FALSE;
  60.  
  61. ULONG id=0L;
  62. UBYTE *mem,*backup;
  63. UBYTE *out;
  64. UBYTE *cstr,*fstr,*tstr;
  65.  
  66. VOID OpenAll();
  67. VOID CloseAll();
  68. VOID GadgetPlus();
  69. VOID Prt();
  70. VOID Ausgabe();
  71. BOOL BMAP=FALSE;
  72. BOOL LLQ=TRUE;
  73. BOOL OFFSET=FALSE;
  74. BOOL BASIS=FALSE;
  75. BOOL UMKEHRUNG=FALSE;
  76. BOOL KO=FALSE;
  77. BOOL BCPL=FALSE;
  78. BOOL DOK=FALSE;
  79. BOOL VOR=FALSE;
  80. BOOL SREG=FALSE;
  81.  
  82. BOOL Req(tex1,tex2,tex3,a,b)
  83.  UBYTE *tex1,*tex2,*tex3,*a,*b;
  84. {
  85.  REGISTER BOOL res;
  86.  register struct Gadget *g;
  87.  register struct IntuiMessage *msg;
  88.  register struct Window *w;
  89.  register struct RastPort *r;
  90.  w=OpenWindow(&rd);
  91.  if(w!=NULL)
  92.   {
  93.    r=w->RPort;
  94.    id=15;
  95.    GadgetPlus(w,10,55,75,12,a,0,RELVERIFY);
  96.    if(b) GadgetPlus(w,365,55,75,12,b,0,RELVERIFY);
  97.    SetAPen(r,2);
  98.    if(tex1) { Move(r,10,15); Text(r,tex1,strlen(tex1)); }
  99.    if(tex2) { Move(r,10,25); Text(r,tex2,strlen(tex2)); }
  100.    if(tex2) { Move(r,10,35); Text(r,tex3,strlen(tex3)); }
  101.    msg=WaitPort(w->UserPort);
  102.    msg=GetMsg(w->UserPort);
  103.    g=msg->IAddress;
  104.    if(g->GadgetID==15) res=FALSE; else res=TRUE;
  105.    ReplyMsg(msg);
  106.    CloseWindow(w);
  107.   }
  108.  else
  109.   {
  110.    res=FALSE;
  111.    DisplayBeep(scr);
  112.   }
  113.  return(res);
  114. }
  115.  
  116. VOID Convert()
  117. {
  118.  REGISTER LONG i,j,k,l,regs,offset;
  119.  UBYTE token[200];
  120.  UBYTE BaseName[100];
  121.  UBYTE RegTab[20];
  122.  UBYTE RegNamTab[20][4];
  123.  WORD w;
  124.  REGISTER BOOL okay=TRUE,BaseOkay=FALSE;
  125.  REGISTER UBYTE chr;
  126.  register struct FileHandle *in,*o1,*o2,*o3,*o4,*o5;
  127.  offset=-30;
  128.  mem=backup;
  129.  if((!BMAP)&&(!OFFSET)&&(!LLQ)&&(!DOK)&&(!VOR))
  130.   {
  131.    Req("Sie haben keine Konvertierungsart gewählt!","Bitte wählen Sie vorher eine Funktion.",0L,"Abbruch",NULL);
  132.   }
  133.  else
  134.   {
  135.    o1=o2=o3=o4=o5=in=NULL;
  136.    in=Open(&FileName,MODE_OLDFILE);
  137.    if(in==NULL)
  138.     {
  139.      Req("Die angegebene Datei",&FileName,"konnte nicht geöffnet werden.","Abbruch",NULL);
  140.     }
  141.    else
  142.     {
  143.      HELP("Konvertierung in\n");
  144.      if(BMAP)
  145.       {
  146.        HELP(" - BMAP-Datei für AmigaBASIC\n");
  147.        sprintf(mem,"%s.bmap",&NeuerName);
  148.        o1=Open(mem,MODE_NEWFILE);
  149.        if(o1==NULL)
  150.         {
  151.          Req("Die BMAP-Datei",mem,"konnte nicht eröffnet werden.","Abbruch",NULL);
  152.          okay=FALSE;
  153.         }
  154.       }
  155.      if(LLQ)
  156.       {
  157.        HELP(" - Linker-Library für C-Compiler\n");
  158.        sprintf(mem,"%s.asm",&NeuerName);
  159.        o2=Open(mem,MODE_NEWFILE);
  160.        if(o2==NULL)
  161.         {
  162.          Req("Die LLQ-Datei",mem,"konnte nicht eröffnet werden.","Abbruch",NULL);
  163.          okay=FALSE;
  164.         }
  165.       }
  166.      if(OFFSET)
  167.       {
  168.        HELP(" - Offset-Datei für Assembler\n");
  169.        sprintf(mem,"%s.i",&NeuerName);
  170.        o3=Open(mem,MODE_NEWFILE);
  171.        if(o3==NULL)
  172.         {
  173.          Req("Die Offset-Datei",mem,"konnte nicht eröffnet werden.","Abbruch",NULL);
  174.          okay=FALSE;
  175.         }
  176.       }
  177.      if(DOK)
  178.       {
  179.        HELP(" - Dokumentations-Grunddatei\n");
  180.        HELP("   für spätere Dokumentation\n");
  181.        sprintf(mem,"%s.doc",&NeuerName);
  182.        o4=Open(mem,MODE_NEWFILE);
  183.        if(o4==NULL)
  184.         {
  185.          Req("Die Dokumentations-Grunddatei",mem,"konnte nicht eröffnet werden.","Abbruch",NULL);
  186.          okay=FALSE;
  187.         }
  188.       }
  189.      if(VOR)
  190.       {
  191.        HELP(" - Vordefinitions-Datei\n");
  192.        sprintf(mem,"%s.h",&NeuerName);
  193.        o5=Open(mem,MODE_NEWFILE);
  194.        if(o5==NULL)
  195.         {
  196.          Req("Die Include-Datei",mem,"konnte nicht eröffnet werden.","Abbruch",NULL);
  197.          okay=FALSE;
  198.         }
  199.        else
  200.         {
  201.          strcpy(out,"#include <exec/types.h>\n");
  202.          Write(o5,out,strlen(out));
  203.         }
  204.       }
  205.      if(GList[31]->Flags & SELECTED) HELP("\nOfs.  Funktionsname\n");
  206.      if(okay==TRUE)
  207.       {
  208.        k=Read(in,mem,249998);
  209.        if(k<=249999)
  210.         {
  211.          if(k!=0)
  212.           {
  213.            for(i=0;i<k;i++)
  214.             {
  215.              if(mem[i]==0x0A) mem[i]=0;
  216.             }
  217.            j=0;
  218.            while(j<k)
  219.             {
  220.              if((mem[0]!='#')&&(mem[0]!='*'))
  221.               {
  222.                l=0;
  223.                if(!BASIS)
  224.                 {
  225.                  regs=0;
  226.                 }
  227.                else
  228.                 {
  229.                  RegTab[0]=16;
  230.                  strcpy(&RegNamTab[0],"A6");
  231.                  regs=1;
  232.                 }
  233.                while((mem[l]==' ')||(mem[l]==0x09)) l++;
  234.                strcpy(&token,""); i=0;
  235.                chr=toupper(mem[l]);
  236.                while(( ((chr>='A')&&(chr<='Z')) || ((chr>='0')&&(chr<='9')) || (chr=='-') ))
  237.                 {
  238.                  token[i]=mem[l]; i++; l++;
  239.                  chr=toupper(mem[l]);
  240.                 }
  241.                token[i]=0x00;
  242.                while( (mem[l]!='(') && (mem[l]!=0x00) ) l++;
  243.                if(mem[l]==0x00)
  244.                 {
  245.                  if(o1) Close(o1);
  246.                  if(o2) Close(o2);
  247.                  if(o3) Close(o3);
  248.                  if(o4) Close(o4);
  249.                  if(o5) Close(o5);
  250.                  Close(in);
  251.                  o1=o2=o3=o4=o5=in=NULL;
  252.                  Req("Die FD-Datei hat bei",&token,"einen Formatfehler!","Abbruch",0L);
  253.                  return;
  254.                 }
  255.                while( (mem[l]!=')') && (mem[l]!=0x00) ) l++;
  256.                if(mem[l]==0x00)
  257.                 {
  258.                  if(o1) Close(o1);
  259.                  if(o2) Close(o2);
  260.                  if(o3) Close(o3);
  261.                  if(o4) Close(o4);
  262.                  if(o5) Close(o5);
  263.                  Close(in);
  264.                  o1=o2=o3=o4=o5=in=NULL;
  265.                  Req("Die FD-Datei hat bei",&token,"einen Formatfehler!","Abbruch",0L);
  266.                  return;
  267.                 }
  268.                l++;
  269.                if(mem[l]!=0x00)
  270.                 {
  271.                  while( (mem[l]!='(') && (mem[l]!=0x00) ) l++;
  272.                  if(mem[l]==0x00)
  273.                   {
  274.                    if(o1) Close(o1);
  275.                    if(o2) Close(o2);
  276.                    if(o3) Close(o3);
  277.                    if(o4) Close(o4);
  278.                    if(o5) Close(o5);
  279.                    Close(in);
  280.                    o1=o2=o3=o4=o5=in=NULL;
  281.                    Req("Die FD-Datei hat bei",&token,"einen Formatfehler!","Abbruch",0L);
  282.                    return;
  283.                   }
  284.                  l++;
  285.                  while((mem[l]!=')')&&(mem[l]!=0x00))
  286.                   {
  287.                    if(mem[l]!=')')
  288.                     {
  289.                      chr=toupper(mem[l]);
  290.                      switch(chr)
  291.                       {
  292.                        case 'D':
  293.                          RegTab[regs]=1;
  294.                          RegNamTab[regs][0]='D';
  295.                         break;
  296.                        case 'A':
  297.                          RegTab[regs]=9;
  298.                          RegNamTab[regs][0]='A';
  299.                         break;
  300.                        default:
  301.                          if(o1) Close(o1);
  302.                          if(o2) Close(o2);
  303.                          if(o3) Close(o3);
  304.                          if(o4) Close(o4);
  305.                          if(o5) Close(05);
  306.                          Close(in);
  307.                          o1=o2=o3=o4=o5=in=NULL;
  308.                          Req("Falscher Registerbuchstabe bei",&token,0L,"Abbruch",0L);
  309.                          return;
  310.                         break;
  311.                        }
  312.                      RegTab[regs]+=mem[l+1]-48;
  313.                      RegNamTab[regs][1]=mem[l+1];
  314.                      RegNamTab[regs][2]=0x00;
  315.                      if(RegTab[regs]>16)
  316.                       {
  317.                        if(o1) Close(o1);
  318.                        if(o2) Close(o2);
  319.                        if(o3) Close(o3);
  320.                        if(o4) Close(o4);
  321.                        if(o5) Close(o5);
  322.                        Close(in);
  323.                        o1=o2=o3=o4=o5=in=NULL;
  324.                        Req("Falsche Registernummer bei",&token,0L,"Abbruch",0L);
  325.                        return;
  326.                       }
  327.                      regs++;
  328.                      l+=2;
  329.                     }
  330.                    l++;
  331.                   }
  332.                 }
  333.                if(BaseOkay==FALSE)
  334.                 {
  335.                  if(o1) Close(o1);
  336.                  if(o2) Close(o2);
  337.                  if(o3) Close(o3);
  338.                  if(o4) Close(o4);
  339.                  if(o5) Close(o5);
  340.                  Close(in);
  341.                  o1=o2=o3=o4=o5=in=NULL;
  342.                  Req("Das Befehlswort ##base muß vor dem ersten Befehl stehen.",0L,0L,"Abbruch",0L);
  343.                  return;
  344.                 }
  345.                if(o1)
  346.                 {
  347.                  strcpy(out,"");
  348.                  for(i=0;i<KNAMEN;i++)
  349.                   {
  350.                    if(!(strcmp(KNamen[i],&token))) { strcpy(out,"x"); i=KNAMEN; }
  351.                   }
  352.                  strcat(out,&token);
  353.                  Write(o1,out,strlen(out));
  354.                  w=0;
  355.                  Write(o1,&w,1L);
  356.                  w=offset;
  357.                  Write(o1,&w,2L);
  358.                  l=0; if(BASIS) l=1;
  359.                  if(regs>l)
  360.                   {
  361.                    if(regs!=NULL)
  362.                     {
  363.                      for(i=l;i<regs;i++)
  364.                       {
  365.                        Write(o1,&RegTab[i],1L);
  366.                       }
  367.                     }
  368.                   }
  369.                  w=0;
  370.                  Write(o1,&w,1L);
  371.                 }
  372.                if(o3)
  373.                 {
  374.                  sprintf(out,"_LVO%s:   EQU %ld\n",&token,offset);
  375.                  Write(o3,out,strlen(out));
  376.                 }
  377.                if(o4)
  378.                 {
  379.                  sprintf(out,"%s()\n",&token);
  380.                  Write(o4,out,strlen(out));
  381.                  for(i=0;i<regs;i++)
  382.                   {
  383.                    sprintf(out,"   -> %s : \n",RegNamTab[i]);
  384.                    Write(o4,out,strlen(out));
  385.                   }
  386.                  Write(o4,"\n\n",2);
  387.                 }
  388.                if(o5)
  389.                 {
  390.                  sprintf(out,"VOID %s();\n",&token);
  391.                  Write(o5,out,strlen(out));
  392.                 }
  393.                if(o2)
  394.                 {
  395.                  if(!KO)
  396.                   {
  397.                    sprintf(out,"   XDEF _LVO%s\n_LVO%s: EQU %ld\n",&token,&token,offset);
  398.                    Write(o2,out,strlen(out));
  399.                   }
  400.                  sprintf(out,"   XDEF _%s\n_%s:\n",&token,&token);
  401.                  Write(o2,out,strlen(out));
  402.                  if(SREG)
  403.                   {
  404.                    strcpy(out,"   MOVEM.L D2-D7/A0-A6,-(SP)\n");
  405.                    Write(o2,out,strlen(out));
  406.                    l=8+(12*4);
  407.                   }
  408.                  else
  409.                    l=4;
  410.  
  411.                  if(!UMKEHRUNG)
  412.                   {
  413.                    for(i=0;i<regs;i++)
  414.                     {
  415.                      sprintf(out,"   MOVE.L %ld(SP),%s\n",l,RegNamTab[i]);
  416.                      Write(o2,out,strlen(out)); l+=4;
  417.                     }
  418.                   }
  419.                  else
  420.                   {
  421.                    for(i=regs-1;i>=0;i--)
  422.                     {
  423.                      sprintf(out,"   MOVE.L %ld(SP),%s\n",l,RegNamTab[i]);
  424.                      Write(o2,out,strlen(out)); l+=4;
  425.                     }
  426.                   }
  427.  
  428.                  if(!BASIS)
  429.                   {
  430.                    sprintf(out,"   MOVE.L %s,A6\n",&BaseName);
  431.                    Write(o2,out,strlen(out));
  432.                   }
  433.  
  434.                  if((BCPL)||(SREG))
  435.                   {
  436.                    sprintf(out,"   JSR %ld(A6)\n",offset);
  437.                    Write(o2,out,strlen(out));
  438.                    if(BCPL) Write(o2,"   MOVE.L D0,D1\n",16);
  439.                    if(SREG)
  440.                      strcpy(out,"   MOVEM.L (SP)+,D2-D7/A0-A6\n   RTS\n");
  441.                    else
  442.                      strcpy(out,"   MOVE.L (SP)+,A6\n   RTS\n");
  443.                    Write(o2,out,strlen(out));
  444.                   }
  445.                  else
  446.                   {
  447.                    sprintf(out,"   JMP %ld(A6)\n",offset);
  448.                    Write(o2,out,strlen(out));
  449.                   }
  450.                 }
  451.                if(GList[31]->Flags & SELECTED)
  452.                 {
  453.                  sprintf(tstr,"%5ld %s\n",offset,&token);
  454.                  Ausgabe(tstr);
  455.                 }
  456.                offset-=6;
  457.               }
  458.              else
  459.               {
  460.                if(!(strncmp(mem,"##base ",7)))
  461.                 {
  462.                  strcpy(&BaseName,mem+7);
  463.                  BaseOkay=TRUE;
  464.                  if(o2)
  465.                   {
  466.                    sprintf(out,"   XREF %s\n",&BaseName);
  467.                    Write(o2,out,strlen(out));
  468.                   }
  469.                 }
  470.                if(!(strncmp(mem,"##bias ",7)))
  471.                 {
  472.                  offset=atol(mem+7);
  473.                  offset=-offset;
  474.                 }
  475.               }
  476.              l=strlen(mem)+1;
  477.              mem+=l; j+=l;
  478.             }
  479.           }
  480.          else
  481.           {
  482.            Req("Die angegebene FD-Datei",&FileName,"ist leer.","Abbruch",NULL);
  483.           }
  484.          if(!Auto) Req("Die Konvertierung wurde erfolgreich beendet.",0L,0L,"Okay",0L);
  485.         }
  486.        else
  487.         {
  488.          Req("Die angegebene FD-Datei",&FileName,"ist über 200 KB lang.","Abbruch",NULL);
  489.         }
  490.       }
  491.      if(o1) Close(o1);
  492.      if(o2)
  493.       {
  494.        Write(o2," END\n\n",6);
  495.        Close(o2);
  496.       }
  497.      if(o3)
  498.       {
  499.        Write(o3," END\n\n",6);
  500.        Close(o3);
  501.       }
  502.      if(o5)
  503.       {
  504.        Write(o5,"\n\n",2);
  505.        Close(o5);
  506.       }
  507.      if(o4) Close(o4);
  508.      Close(in);
  509.     }
  510.   }
  511.  if(GList[31]->Flags & SELECTED) Ausgabe("\n");
  512.  o1=o2=o3=o4=o5=in=NULL;
  513. }
  514.  
  515. VOID main(argc,argv)
  516.  long   argc;
  517.  UBYTE *argv[];
  518. {
  519.  register struct IntuiMessage *msg;
  520.  register struct Gadget *gad;
  521.  REGISTER ULONG class,chip,fast,total;
  522.  REGISTER BOOL ende=FALSE;
  523.  
  524.  if((argc==1)&&(!(strcmp(argv[1],"?"))))
  525.   {
  526.    printf("Aufruf: %s [FD-Datei] [Ausgabe-Datei] [AUTO]\n",argv[0]);
  527.    exit(0);
  528.   }
  529.  
  530.  if(argc>1)
  531.   { strcpy(&FileName,argv[1]); Arg1=TRUE; }
  532.  if(argc>2)
  533.   { strcpy(&NeuerName,argv[2]); Arg2=TRUE; }
  534.  
  535.  if(argc>3)
  536.   {
  537.    if(!(strcmp(argv[3],"AUTO")))
  538.     {
  539.      Auto=TRUE;
  540.      OpenAll();
  541.      Convert();
  542.      CloseAll();
  543.      exit(0);
  544.     }
  545.   }
  546.  
  547.  OpenAll();
  548.  
  549.  while(ende==FALSE)
  550.   {
  551.    msg=WaitPort(win->UserPort);
  552.    msg=GetMsg(win->UserPort);
  553.    class=msg->Class;
  554.    gad=msg->IAddress;
  555.    ReplyMsg(msg);
  556.    switch(class)
  557.     {
  558.      case GADGETDOWN:
  559.        id=gad->GadgetID;
  560.       break;
  561.      case GADGETUP:
  562.        id=gad->GadgetID;
  563.        switch(id)
  564.         {
  565.          case 20:
  566.            ActivateGadget(&str2,win,NULL);
  567.           break;
  568.          case 21:
  569.            ActivateGadget(&str1,win,NULL);
  570.           break;
  571.          case 7:
  572.            HELP("Konvertierung starten\n");
  573.            if(GList[0]->Flags & SELECTED) BMAP=TRUE; else BMAP=FALSE;
  574.            if(GList[1]->Flags & SELECTED) LLQ=TRUE; else LLQ=FALSE;
  575.            if(GList[2]->Flags & SELECTED) OFFSET=TRUE; else OFFSET=FALSE;
  576.            if(GList[3]->Flags & SELECTED) BASIS=TRUE; else BASIS=FALSE;
  577.            if(GList[4]->Flags & SELECTED) UMKEHRUNG=TRUE; else UMKEHRUNG=FALSE;
  578.            if(GList[5]->Flags & SELECTED) KO=TRUE; else KO=FALSE;
  579.            if(GList[6]->Flags & SELECTED) BCPL=TRUE; else BCPL=FALSE;
  580.            if(GList[11]->Flags & SELECTED) DOK=TRUE; else DOK=FALSE;
  581.            if(GList[12]->Flags & SELECTED) VOR=TRUE; else VOR=FALSE;
  582.            if(GList[13]->Flags & SELECTED) SREG=TRUE; else SREG=FALSE;
  583.            Convert();
  584.            HELP("Konvertierung beendet\n");
  585.           break;
  586.          case 8:
  587.            HELP("Programm beenden\n");
  588.            ende=Req("Wollen Sie ConvertFD Plus wirklich beenden ?",0L,0L,"Zurück","Ende");
  589.           break;
  590.          case 9:
  591.            HELP("Informationen über ConvertFD Plus\n");
  592.            fast=AvailFastMem();
  593.            chip=AvailChipMem();
  594.            total=AvailMemory();
  595.            sprintf(cstr,"Chip:    %4ld KB  =  %8ld Bytes",chip/1024,chip);
  596.            sprintf(fstr,"Fast:    %4ld KB  =  %8ld Bytes",fast/1024,fast);
  597.            sprintf(tstr,"Gesamt:  %4ld KB  =  %8ld Bytes",total/1024,total);
  598.            Req(cstr,fstr,tstr,"Weiter",0L);
  599.            sprintf(tstr,"ConvertFD Plus Version %s",VERSION);
  600.            Req(tstr,"Copyright (C) 1992 by Thomas Dreibholz.","All rights reserved.","Okay",0L);
  601.           break;
  602.          case 10:
  603.            if(GList[10]->Flags & SELECTED)
  604.             {
  605.              Ausgabe("Hilfsfunktion eingeschaltet\n");
  606.             }
  607.            else
  608.             {
  609.              Ausgabe("Hilfsfunktion ausgeschaltet\n");
  610.             }
  611.           break;
  612.          case 30:
  613.            Ausgabe("\f");
  614.            HELP("Ausgabebereich löschen\n");
  615.           break;
  616.          case 31:
  617.            HELP("Ausgabe von Offset und Name ein/aus\n");
  618.           break;
  619.          case 32:
  620.            DateStamp(uhr);
  621.            sprintf(tstr,"Es ist %ld:%02ld:%02ld Uhr.\n",uhr->ds_Minute/60,
  622.                                                     uhr->ds_Minute%60,
  623.                                                     uhr->ds_Tick/50);
  624.            Ausgabe(tstr);
  625.           break;
  626.          default:
  627.           if( ((id>=0)&&(id<=2)) || (id==11) || (id==12) )
  628.            {
  629.             HELP("Funktion aktiviert/deaktiviert\n");
  630.            }
  631.           else
  632.            {
  633.             switch(id)
  634.              {
  635.               case 3:
  636.                 HELP("LLQ ist Basisorientiert (ein/aus)\n");
  637.                break;
  638.               case 4:
  639.                 HELP("Registerumkehrung (ein/aus)\n");
  640.                break;
  641.               case 5:
  642.                 HELP("Keine Offsets (ein/aus)\n");
  643.                break;
  644.               case 6:
  645.                 HELP("LLQ ist BCPL-Kompatibel (ein/aus)\n");
  646.                break;
  647.              }
  648.            }
  649.           break;
  650.         }
  651.       break;
  652.      case VANILLAKEY:
  653.        ende=TRUE;
  654.       break;
  655.     }
  656.   }
  657.  CloseAll();
  658. }
  659.  
  660. VOID GadgetPlus(w,ax,ay,aw,ah,tex,flgs,act)
  661.  struct Window *w;
  662.  LONG ax,ay,aw,ah;
  663.  UBYTE *tex;
  664.  ULONG flgs,act;
  665. {
  666.  register struct RastPort *r;
  667.  register struct Gadget *gad;
  668.  REGISTER LONG x1,y1,x2,y2,x,y,pl;
  669.  gad=AllocRMemory(sizeof(struct Gadget));
  670.  if(gad==NULL)
  671.   {
  672.    printf("Es steht nicht genug Speicher für Schalter zur Verfügung.\n");
  673.    CloseAll();
  674.   }
  675.  gad->LeftEdge=ax;
  676.  gad->TopEdge=ay;
  677.  gad->Width=aw;
  678.  gad->Height=ah;
  679.  gad->Flags=flgs;
  680.  gad->Activation=act;
  681.  gad->GadgetType=BOOLGADGET;
  682.  gad->GadgetID=id;
  683.  GList[id]=gad;
  684.  id++;
  685.  r=w->RPort;
  686.  
  687.  x1=ax+1;
  688.  y1=ay+1;
  689.  x2=x1+aw-3;
  690.  y2=y1+ah-3;
  691.  SetAPen(r,1);
  692.  Move(r,x1-1,y2);
  693.  Draw(r,x1-1,y1-1);
  694.  Draw(r,x2,y1-1);
  695.  SetAPen(r,2);
  696.  Move(r,x2+1,y1-1);
  697.  Draw(r,x2+1,y2);
  698.  Move(r,x2+1,y2+1);
  699.  Draw(r,x1-1,y2+1);
  700.  pl=TextLength(r,tex,strlen(tex));
  701.  x=ax+((aw-pl)/2);
  702.  y=ay+3+(ah/2);
  703.  Move(r,x,y);
  704.  Text(r,tex,strlen(tex));
  705.  
  706.  AddGadget(w,gad,-1L);
  707.  OnGadget(gad,w,0L);
  708. }
  709.  
  710. VOID CloseAll()
  711. {
  712.  if(con) CloseWindow(con);
  713.  if(ConDev==NULL) CloseDevice(io);
  714.  if(io) DeleteExtIO(io);
  715.  if(Port) DeletePort(Port);
  716.  if(win) CloseWindow(win);
  717.  if(scr) CloseScreen(scr);
  718.  if(DigitalBase)
  719.   {
  720.    FreeRMemory();
  721.    CloseLibrary(DigitalBase);
  722.   }
  723.  if(GfxBase) CloseLibrary(GfxBase);
  724.  if(IntuitionBase) CloseLibrary(IntuitionBase);
  725.  exit(0);
  726. }
  727.  
  728. VOID Ausgabe(tex)
  729.  UBYTE *tex;
  730. {
  731.  io->io_Command=CMD_WRITE;
  732.  io->io_Data=tex;
  733.  io->io_Length=strlen(tex);
  734.  DoIO(io);
  735. }
  736.  
  737. VOID Prt(x,y,t)
  738.  LONG x,y;
  739.  UBYTE *t;
  740. {
  741.  SetAPen(rp,3);
  742.  Move(rp,x,y);
  743.  Text(rp,t,strlen(t));
  744. }
  745.  
  746. VOID OpenAll()
  747. {
  748.  IntuitionBase=OpenLibrary("intuition.library",0L);
  749.  GfxBase=OpenLibrary("graphics.library",0L);
  750.  DigitalBase=OpenLibrary("digital.library",0L);
  751.  if(DigitalBase==NULL)
  752.   {
  753.    printf("Die Digital-Library ist nicht verfügbar.\n");
  754.    CloseAll();
  755.   }
  756.  mem=AllocRMemory(250000);
  757.  out=AllocRMemory(1000);
  758.  if((mem==NULL)||(out==NULL))
  759.   {
  760.    printf("Es steht nicht genug Speicher für DOS-Operationen zur Verfügung.\n");
  761.    printf("ConvertFD Plus benötigt 250 KB für die Dateisicherung\n");
  762.    CloseAll();
  763.   }
  764.  backup=mem;
  765.  cstr=AllocRMemory(60);
  766.  fstr=AllocRMemory(60);
  767.  tstr=AllocRMemory(120);
  768.  uhr=AllocRMemory(sizeof(struct DateStamp));
  769.  if((cstr==NULL)||(fstr==NULL)||(tstr==NULL)||(uhr==NULL))
  770.   {
  771.    printf("Es steht nicht genug Speicher für das Info-Fenster zur Verfügung.\n");
  772.    CloseAll();
  773.   }
  774.  Port=CreatePort("output.port");
  775.  if(Port==NULL)
  776.   {
  777.    printf("Es steht nicht genug Speicher für die Task-Kommunikation\n");
  778.    printf("zur Verfügung.\n");
  779.    CloseAll();
  780.   }
  781.  io=CreateExtIO(Port,250);
  782.  if(io==NULL)
  783.   {
  784.    printf("Es steht nicht genug Speicher für die Device-Kommunikation\n");
  785.    printf("zur Verfügung.\n");
  786.    CloseAll();
  787.   }
  788.  if(Auto) ns.Type |= SCREENBEHIND;
  789.  scr=OpenScreen(&ns);
  790.  if(scr==NULL)
  791.   {
  792.    printf("Es steht nicht genug Speicher für die Oberfläche zur Verfügung.\n");
  793.    CloseAll();
  794.   }
  795.  nw.Screen=scr;
  796.  rd.Screen=scr;
  797.  cw.Screen=scr;
  798.  if(!Arg1) strcpy(&FileName,"FD:dos_lib.fd");
  799.  if(!Arg2) strcpy(&NeuerName,"RAM:dos");
  800.  win=OpenWindow(&nw);
  801.  if(win==NULL)
  802.   {
  803.    printf("Es steht nicht genug Speicher für die Windows zur Verfügung.\n");
  804.    CloseAll();
  805.   }
  806.  con=OpenWindow(&cw);
  807.  if(con==NULL)
  808.   {
  809.    printf("Es steht nicht genug Speicher für das Ausgabefenster\n");
  810.    printf("zur Verfügung.\n");
  811.    CloseAll();
  812.   }
  813.  io->io_Data=con;
  814.  io->io_Length=sizeof(struct Window);
  815.  ConDev=OpenDevice("console.device",0L,io,0L);
  816.  if(ConDev!=NULL)
  817.   {
  818.    printf("Es steht nicht genug Speicher für das \"console.device\"\n");
  819.    printf("zur Verfügung.\n");
  820.    CloseAll();
  821.   }
  822.  rp=win->RPort;
  823.  vp=ViewPortAddress(win);
  824.  SetRGB4(vp,0,7,7,7);
  825.  SetRGB4(vp,1,15,15,15);
  826.  SetRGB4(vp,2,0,0,0);
  827.  SetRGB4(vp,3,15,15,5);
  828.  SetRGB4(vp,13,15,15,15);
  829.  SetRGB4(vp,14,0,0,0);
  830.  SetRGB4(vp,15,3,7,15);
  831.  GadgetPlus(win,20,110,296,12,"AmigaBASIC BMAP-Datei",0,RELVERIFY|TOGGLESELECT);
  832.  GadgetPlus(win,20,125,296,12,"Linker-Library-Quellcode",SELECTED,RELVERIFY|TOGGLESELECT);
  833.  GadgetPlus(win,20,140,296,12,"Offset-Tabelle",0,RELVERIFY|TOGGLESELECT);
  834.  GadgetPlus(win,20,180,296,12,"Basis als erster Parameter",0,RELVERIFY|TOGGLESELECT);
  835.  GadgetPlus(win,20,195,296,12,"Umkehrung der Registerablage",0,RELVERIFY|TOGGLESELECT);
  836.  GadgetPlus(win,20,210,296,12,"Keine Assembler-Offsets",0,RELVERIFY|TOGGLESELECT);
  837.  GadgetPlus(win,20,225,296,12,"Rückgabe in D0 und D1",0,RELVERIFY|TOGGLESELECT);
  838.  GadgetPlus(win,20,10,68,12,"Start",0,RELVERIFY);
  839.  GadgetPlus(win,89,10,68,12,"Ende",0,RELVERIFY);
  840.  GadgetPlus(win,163,10,68,12,"Info",0,RELVERIFY);
  841.  GadgetPlus(win,232,10,68,12,"Hilfe",0,RELVERIFY|TOGGLESELECT);
  842.  GadgetPlus(win,320,110,296,12,"Dokumentations-Grunddatei",0,RELVERIFY|TOGGLESELECT);
  843.  GadgetPlus(win,320,125,296,12,"Aztec-C VOID-Vordefinition",0,RELVERIFY|TOGGLESELECT);
  844.  GadgetPlus(win,320,140,296,12,"Register sichern",0,RELVERIFY|TOGGLESELECT);
  845.  id=30; GadgetPlus(win,568,166,48,12,"CLS",0,RELVERIFY);
  846.         GadgetPlus(win,518,166,48,12,"Ein",0,RELVERIFY|TOGGLESELECT);
  847.         GadgetPlus(win,468,166,48,12,"Uhr",0,RELVERIFY);
  848.  GadgetPlus(win,320,140,296,12,"Register sichern",0,RELVERIFY|TOGGLESELECT);
  849.  Prt(30,40,"Name der FD-Datei:");
  850.  Prt(30,70,"Neuer Dateiname ohne Endung:");
  851.  Prt(30,105,"Umwandlung in");
  852.  Prt(30,175,"LLQ-Optionen");
  853.  Prt(330,175,"Ausgabe");
  854.  sprintf(tstr," Willkommen zu ConvertFD Plus V%s\n",VERSION);
  855.  Ausgabe(tstr);
  856.  Ausgabe("       Copyright (C) 1992 by\n");
  857.  Ausgabe("          Thomas Dreibholz   \n");
  858.  Ausgabe("        All rights reserved.\n\n");
  859. }
  860.  
  861.